package src;

import src.exceptions.*;
import java.util.ArrayList;
import java.util.Iterator;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author usuario_local
 */

// Esta clase se implementará como un Singleton
public class ListaUsuarios {

    private static String monitor = "Monitor";

     // Constructora tipo singleton
    static private ListaUsuarios lu = null;

    private ListaUsuarios() {
        // Importante, crear la lista con un usuario admin por defecto
        lu_lista = new ArrayList();
        lu_total = 0;
        // Creamos el usuario admin y le damos permisos
        Usuario u = new Usuario("admin","admin");
        u.setPermisos(Permisos.ADMIN);
        // Lo añadimos a la lista
        lu_lista.add(u);
        this.setTotal();
    }

    static public ListaUsuarios getListaUsuarios() {

        synchronized(monitor){
            if (lu == null) {
            lu = new ListaUsuarios();
            }        
        }
        return lu;        
    }

    // Atributos
    private ArrayList<Usuario> lu_lista;
    private int lu_total;

    // Métodos
    public ArrayList<Usuario> getLista(){ return lu_lista; }
    public int getTotal(){ return lu_total; }

    // Metodos auxiliares
    /*public void ordenar(){
        // Elegimos el comparador
        CompararUsuarios c = new CompararUsuarios();
        // Ver clase Usuario para saber como ordena
        Collections.sort((ArrayList)lu_lista,c);
    }*/

    private void setTotal() {
        lu_total = lu_lista.size();
    }

    // Metodos propios de la lista: Insertar, Borrar, etc  
    
    public void insertarUsuario(String nombre) throws eInsertarUsuario{

        // Comprobamos que el usuario no esté duplicado
        try{
            boolean esta = this.existe(nombre);
            if (esta) throw new eInsertarUsuario("El usuario ya existe");
            else{
                // Si el usuario no existe, lo creamos y lo añadimos
                Usuario aux = new Usuario(nombre, "");
                this.lu_lista.add(aux);
            }
            return;
        }
        catch (eInsertarUsuario e){
            // Aqui habria que tratar la excepcion
            // Pasarsela a quien haga falta..
        }

    }

    public boolean existe(String nombre){
        boolean encontrado = false;
        Iterator<Usuario> itr = this.lu_lista.iterator();
        while (itr.hasNext() && !encontrado) {
            Usuario u = itr.next();
            if (u.getNombre().equals(nombre)){
                encontrado = true;                
            }
        }
        return encontrado;
    }

    // Los vamos a buscar de manera ineficiente...la tradicional
    public Usuario getUsuario(String nombre){
        boolean encontrado = false;        
        Iterator<Usuario> itr = this.lu_lista.iterator();
        while (itr.hasNext() && !encontrado) {
            Usuario u = itr.next();
            if (u.getNombre().equals(nombre)){ //&& u.getPermisos().equals(p)){
                encontrado = true;
                return u;
            }
        }
        return null;
    }

    
    
    public void borrarUsuario(String nombre) throws eBorrarUsuario{
        // Buscamos el usuario, si esta lo borramos
        try{
            Usuario u= this.getUsuario(nombre);
            if (u == null) throw new eBorrarUsuario("El usuario no existe");
            else{
                // Si el usuario existe, lo borramos, excepto el admin
                if (u.getNombre().equals("admin")) throw new eBorrarUsuario("No se puede eliminar el usuario administrador");
                else{
                    // Ahora si que lo borramos
                    this.lu_lista.remove(u);
                }
            }
        }        
        catch (eBorrarUsuario e){
            // Tratamiento de la excepcion
        }

         
    }

   

    







}
